﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Farmacia.Entities;
using Microsoft.Practices.EnterpriseLibrary.Common.Configuration;
using Microsoft.Practices.EnterpriseLibrary.Data;
using Microsoft.Practices.Unity;
using System.Data.Common;

namespace Farmacia.DataAccess
{
    public class PedidoDAO:MasterDAEL, iPedidoDAO 
    {
        [Dependency]
        public iClienteDAO clienteDAO { get; set; }
        
        List<Cliente> listaCliente;
        [Dependency]
        public iDetallePedidoDAO DetallePedidoDAO { get; set; }

    /*    public List<Pedido> GetFromPedidoByCliente(string criterio)
        {

        }*/

        public PedidoNuevo GetFromPedidoById(int pedidoId)
        {
            listaCliente = clienteDAO.GetAllFromCliente();

            var query = DataBase.ExecuteSprocAccessor<PedidoNuevo>("GetFromPedidoById",RowMapperFactory(),pedidoId);
            return query.SingleOrDefault();
        }

        public void RegistrarPedido(PedidoNuevo pedido)
        {
            DbCommand command = DataBase.GetStoredProcCommand("RegistrarPedido");

            DbParameter param = command.CreateParameter();
            param.Direction = System.Data.ParameterDirection.InputOutput;
            param.ParameterName = "id";
            param.DbType = System.Data.DbType.Int32;
            param.Value = pedido.IdPedido;

            command.Parameters.Add(param);
            DataBase.AddInParameter(command, "id", System.Data.DbType.Int32,pedido.IdPedido);
            DataBase.AddInParameter(command, "clienteId", System.Data.DbType.Int32,pedido.IdCliente);
            DataBase.AddInParameter(command, "fecha", System.Data.DbType.DateTime,pedido.FecPedido);
            DataBase.ExecuteNonQuery(command);
            pedido.IdPedido = Int32.Parse(param.Value.ToString());
            DetallePedidoDAO.RegistrarDetalle(pedido.IdPedido);
        }

        public void EliminarPedido(int pedidoId)
        {
            throw new NotImplementedException();
        }
        
        private IRowMapper<PedidoNuevo> RowMapperFactory()
        {
            IRowMapper<PedidoNuevo> rowMapperNN = MapBuilder<PedidoNuevo>
                .MapAllProperties()
                .Map(p => p.Cliente).WithFunc(p => GetFromClienteById(p.GetInt32(p.GetOrdinal("idCliente"))))
                .Map(p => p.DetallePedido)
                .WithFunc(p => DetallePedidoDAO.GetFromDetallePedidobyPedidoId(p.GetInt32(p.GetOrdinal("IdPedido"))))
                .Build();
            return rowMapperNN;
        }
       
        private Cliente GetFromClienteById(Int32 id)
        {
            var query = from c in listaCliente
                        where c.IdCliente == id
                        select c;
                        return query.SingleOrDefault();
        }

        public List<Pedido> GetFromPedidoByCliente(string criterio, DateTime fecha1, DateTime fecha2)
        {
            object[] param = new object[3];
            param[0] = criterio;
            param[1] = fecha1;
            param[2] = fecha2;
            var query = DataBase.ExecuteSprocAccessor<Pedido>("GetFromPedidobyClienteandtime", param);
            return query.ToList();
        }
    }
}
